home *** CD-ROM | disk | FTP | other *** search
- # include <stdio.h>
- # include "constants.h"
- # include "globals.h"
- # include "y.tab.h"
- # include <sccs.h>
-
- SCCSID(@(#)string.c 8.1 12/31/84)
-
-
- /*
- ** STRING -- processes a string constant
- ** Strings are kept internally exactly as their external
- ** appearance, except for the outermost '"'.
- ** A string may be at most MAXSTRING characters
- ** long, and may have escaped newlines.
- **
- ** Parameters:
- ** op -- pointer to string quote operator
- ** table entry.
- **
- ** Returns:
- ** SCONST
- */
-
-
- string(op)
- struct optab *op;
- {
- char buf [MAXSTRING + 1];
- register char c, *cp;
- int error;
- register int escape;
-
- error = escape = 0;
- cp = buf;
- for ( ; ; )
- {
- c = getch();
- switch (c)
- {
-
- case '\\' :
- if (!escape)
- escape = 2;
- goto regchar;
-
- case '\n' :
- if (escape)
- goto regchar;
- *cp = '\0';
- yysemerr("non-terminated string",
- !error ? buf : 0);
- break;
-
- case EOF_TOK :
- backup(c);
- *cp = '\0';
- yysemerr("EOF in string",
- !error ? buf : 0);
- break;
-
- default :
- regchar :
- if (c == *op->op_term && !escape)
- {
- /* end of string */
- *cp = '\0';
- break;
- }
- if (!error)
- {
- if (cp - buf < MAXSTRING)
- {
- if (Cmap [c] == CNTRL)
- yysemerr("control character in string eliminated",
- 0);
- else
- *cp++ = c;
- }
- else
- {
- yysemerr("string too long, rest discarded",
- 0);
- error = 1;
- }
- }
- if (escape)
- --escape;
- continue;
- }
- break;
- }
- yylval.u_dn = addsym(salloc(buf));
- return (Tokens.sp_sconst);
- }
-